package com.gufe.controller.common;


import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
public class CaptureController {

    @Autowired
    private RedisTemplate redisTemplate;


    @RequestMapping("/admin/captcha")
    public void captcha(HttpServletResponse response) throws Exception {

        ValueOperations valueOperations = redisTemplate.opsForValue();

        // 设置验证码图片的宽高以及验证码的长度
        SpecCaptcha specCaptcha = new SpecCaptcha(135, 33, 4);
        // 设置验证码的类型
        specCaptcha.setCharType(Captcha.TYPE_NUM_AND_UPPER);

        // 设置内置字体
        specCaptcha.setFont(Captcha.FONT_2);

        // 获取生成的验证码
        String verCode = specCaptcha.text().toLowerCase();
        System.out.println(verCode);
        String key = UUID.randomUUID().toString();
        // 存入redis并设置过期时间为1分钟
        valueOperations.set(key, verCode, 1, TimeUnit.MINUTES);

        // 设置 Cookie
        Cookie cookie = new Cookie("CaptchaKey", key);
        cookie.setPath("/");
        cookie.setMaxAge(1 * 60); // 1 分钟过期
        response.addCookie(cookie);

        // 设置响应头信息

        // 表明服务器返回的数据类型是PNG图像
        response.setContentType("image/png");

        /*
          no-cache：告诉所有中间缓存（包括浏览器）在使用缓存之前必须先向源服务器验证内容是否已经更改。
          no-store：明确禁止任何缓存存储关于此请求或响应的信息，适用于敏感数据，防止其被无意间泄露。
          must-revalidate：要求代理或其他缓存在提供缓存版本前必须检查资源的新鲜度，即使超过了最大年龄（max-age），
          也需重新验证。
         */
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

        /*
          Pragma 是 HTTP/1.0 中定义的一个头部字段，主要用于向后兼容旧版HTTP协议下的缓存控制。
          它的作用类似于 Cache-Control: no-cache，即指示客户端不要缓存响应内容。
         */
        response.setHeader("Pragma", "no-cache");

        // 将验证码图片写入响应流
        specCaptcha.out(response.getOutputStream());
        response.flushBuffer(); // 确保所有数据都被写出

    }
}